﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using GestorDeFlotasModelo.Entities;
using GestorDeFlotasDesktop.UILogic.Helpers;
using GestorDeFlotasDesktop.UILogic;
using GestorDeFlotasModelo.Factorias;

namespace GestorDeFlotasDesktop.AbmAuto
{
    public partial class frmFormAuto : BaseForm
    {
        Auto AutoAModificar;
        frmListadoAuto FormPadre;
        public frmFormAuto(Auto autoAModificar, frmListadoAuto formPadre)
        {
            AutoAModificar = autoAModificar;
            FormPadre = formPadre;
            InitializeComponent();
        }

        protected override void OnVisibleChanged(EventArgs e)
        {
            if (AutoAModificar != null)
                AutoAModificar = Transaccion.Factoria<FactoriaAuto>().SelectXId<Auto>(AutoAModificar.Id.ToString());
            base.OnVisibleChanged(e);
            CargarCombos();
            if (AutoAModificar != null)
                CargarDatosEnForm();
        }

        private void CargarCombos()
        {
            List<string> marcas;
            if (Contexto.MarcasAutos == null)
            {
                List<Auto> autos = Transaccion.Factoria<FactoriaAuto>().SelectTodos<Auto>();
                marcas = new List<string>();
                autos.ForEach(a => marcas.Add(a.Marca));
                marcas = marcas.Distinct().ToList();
                Contexto.MarcasAutos = marcas;
            }
            else
                marcas = Contexto.MarcasAutos;

            List<ComboBoxItem> items = new List<ComboBoxItem>();
            foreach (string marca in marcas)
            {
                items.Add(new ComboBoxItem(marca, marca));
            }
            cmbMarca.ValueMember = "Value";
            cmbMarca.DisplayMember = "Text";
            cmbMarca.Items.AddRange(items.ToArray());

            List<Reloj> relojes = Transaccion.Factoria<FactoriaReloj>().SelectTodos<Reloj>().Where(x => x.Habilitado).ToList<Reloj>();
            cmbReloj.ValueMember = "Id";
            cmbReloj.DisplayMember = "NumeroDeSerie";
            cmbReloj.Items.AddRange(relojes.OrderBy(x => x.NumeroDeSerie).ToArray());

            cmbReloj.SelectedIndex = 0;
            cmbMarca.SelectedIndex = 0;
        }

        private void CargarDatosEnForm()
        {
            txtLicencia.Text = AutoAModificar.Licencia;
            txtModelo.Text = AutoAModificar.Modelo;
            txtPatente.Text = AutoAModificar.Patente;
            txtRodado.Text = AutoAModificar.Rodado;
            cmbMarca.SelectedIndex = cmbMarca.FindStringExact(AutoAModificar.Marca);
            cmbReloj.SelectedIndex = cmbReloj.FindStringExact(AutoAModificar.Reloj.NumeroDeSerie);
            chkHabilitado.Checked = AutoAModificar.Habilitado;
        }

        private void frmFormAuto_Load(object sender, EventArgs e)
        {

        }

        private void butGuardar_Click(object sender, EventArgs e)
        {
            try
            {
                List<Auto> autos = Transaccion.Factoria<FactoriaAuto>().SelectAutosConFiltro(null, null, null, null, ((Reloj)cmbReloj.SelectedItem).Id);

                if (AutoAModificar != null) autos.RemoveAll(x => x.Id == AutoAModificar.Id); //si soy yo mismo el que tiene el reloj esta bien!
                if (autos.Any(x => x.Habilitado) && chkHabilitado.Checked) // si alguno esta habilitado Y el que guardo lo estoy poniendo como habilitado
                    MessageBox.Show("El campo Reloj no puede estar repetido entre 2 autos habilitados", "Auto", MessageBoxButtons.OK, MessageBoxIcon.Error);

                else if (ValidarForm())
                {
                    if (AutoAModificar != null)
                    {
                        try
                        {
                            AutoAModificar = Transaccion.Factoria<FactoriaAuto>().SelectXId<Auto>(AutoAModificar.Id.ToString());
                            CargarAuto(AutoAModificar);
                            Transaccion.Persistir();
                            MessageBox.Show("El auto se ha guardado con exito");
                            if (FormPadre != null) FormPadre.CargarConFiltros();
                            this.Hide();
                        }
                        catch (Exception ex)
                        {
                            MessageBox.Show(ConstruirError(ex.Message));
                        }
                    }
                    else
                        try
                        {
                            Auto autoNuevo = Transaccion.Factoria<FactoriaAuto>().Nuevo(txtModelo.Text,
                                                            ((ComboBoxItem)cmbMarca.SelectedItem).Value.ToString(),
                                                            txtPatente.Text,
                                                            txtLicencia.Text,
                                                            txtRodado.Text,
                                                            chkHabilitado.Checked,
                                                            (Reloj)cmbReloj.SelectedItem);
                            Transaccion.Persistir();
                            MessageBox.Show("El auto se ha guardado con exito");

                            this.Hide();
                        }
                        catch (Exception ex)
                        {
                            MessageBox.Show(ConstruirError(ex.Message));
                        }
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
            
        }

        private bool ValidarForm()
        {
            string error = string.Empty;

            if (string.IsNullOrEmpty(txtModelo.Text))
                error += "Debe completar el campo Modelo " + Environment.NewLine;

            if (string.IsNullOrEmpty(txtPatente.Text))
                error += "Debe completar el campo Patente " + Environment.NewLine;
            else if (txtPatente.Text.Length > 10)
                error += "El campo Patente no puede exceder los 10 caracteres" + Environment.NewLine;

            if (string.IsNullOrEmpty(txtLicencia.Text))
                error += "Debe completar el campo Licencia " + Environment.NewLine;
            else if (txtPatente.Text.Length > 26)
                error += "El campo Licencia no puede exceder los 26 caracteres" + Environment.NewLine;

            if (string.IsNullOrEmpty(txtRodado.Text))
                error += "Debe completar el campo Rodado " + Environment.NewLine;
            else if (txtRodado.Text.Length > 10)
                error += "El campo Rodado no puede exceder los 10 caracteres" + Environment.NewLine;

            if (!string.IsNullOrEmpty(error))
                MessageBox.Show(error, "Auto", MessageBoxButtons.OK , MessageBoxIcon.Error);

            return string.IsNullOrEmpty(error);
        }

        private string ConstruirError(string p)
        {
            string error=string.Empty;
            if (p.Contains("Violation of UNIQUE KEY constraint"))
                error = string.Format("ERROR: El campo {0} no puede estar repetido entre 2 autos",
                    p.Contains("Licencia") ? "Licencia" :
                    p.Contains("Patente") ? "Patente" : string.Empty);
            else
                error = p;

            return error;
        }

        private void CargarAuto(Auto AutoAModificar)
        {
            AutoAModificar.Habilitado = chkHabilitado.Checked;
            AutoAModificar.Licencia = txtLicencia.Text;
            AutoAModificar.Marca = ((ComboBoxItem)cmbMarca.SelectedItem).Value.ToString();
            AutoAModificar.Modelo = txtModelo.Text;
            AutoAModificar.Patente = txtPatente.Text;
            AutoAModificar.Reloj = (Reloj)cmbReloj.SelectedItem;
            AutoAModificar.Rodado = txtRodado.Text;
        }
    }
}
